package n6_monitor对象头_偏向锁;

import lombok.extern.slf4j.Slf4j;
import org.openjdk.jol.info.ClassLayout;

import java.util.Vector;

/**
 <b>批量重定向</b>

 如果对象虽然被多个线程访问，但没有竞争，这时偏向了线程 T1 的对象仍有机会重新偏向 T2，重偏向会 [--重置对象头Mark Word里 的 Thread ID--]
 <i>当撤销偏向锁阈值超过 20 次后</i>，jvm 会这样觉得，我是不是偏向错了呢，于是会在给这些对象加锁时重新偏向至 加锁线程


 偏向锁是默认是延迟的，不会在程序启动时立即生效，如果想避免延迟，可以加 [-- VM 参数  -XX:BiasedLockingStartupDelay=0 --]
 */
@Slf4j(topic = "c.T3")
public class T3_偏向锁_批量重定向 {


    /**
     1. 两个线程一起执行
     2. 线程2 进入等待
     3. 等 线程1 执行完毕唤醒 线程2
     4. 线程2 才开始执行
     * @param args
     */
    public static void main(String[] args) {

        Vector<Dog3> list = new Vector<>();
        Thread t1 = new Thread(() -> {
            // 1. 偏向锁 30次
            for (int i = 0; i < 30; i++) {
                Dog3 d = new Dog3();
                list.add(d);
                synchronized (d) {
                    log.debug("<<<<<<-线程A-<<<<<<----- "+i + " ----->>>>>>>-线程A->>>>>" + "\t" + ClassLayout.parseInstance(d).toPrintable());
                }
            }
            synchronized (list) {
                list.notify();
            }
        }, "--- A ---");
        t1.start();

        Thread t2 = new Thread(() -> {
            synchronized (list) {
                try {
                    list.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            log.debug("=======================================================================> ");
            for (int i = 0; i < 30; i++) {
                Dog3 d = list.get(i);
                log.debug("【【【【【【【>>>>>>>>>>----- "+i + " -----<<<<<<<<<<<<<<<<<<<<" + "\t" + ClassLayout.parseInstance(d).toPrintable());
                synchronized (d) {
                    // i < 19 时 ，升级为 【-轻量级锁-】          [ 达到 阈值后，偏向锁成 101 ]
                    // <i>当撤销偏向锁阈值超过 20 次后</i>，jvm 会这样觉得，我是不是偏向错了呢，于是会在给这些对象加锁时重新偏向至 加锁线程
                  log.debug("       <<<synchronized----- "+ i + " -----synchronized>>>     " + "\t" + ClassLayout.parseInstance(d).toPrintable());
                }
                // i < 19 时 ,解锁以后： 撤销成 001 不可偏向      [ 达到 阈值后，偏向锁成 101 ]
                log.debug(">>>>>>>>>>>>>>>>>>>>>>----- "+i + " -----<<<<<<<<<<<】】】】】】" + "\t" + ClassLayout.parseInstance(d).toPrintable());
            }
        }, "--- B ---");
        t2.start();

    }

}

class Dog3 {

}
